'use strict';
/**
 * 图片裁剪通用组件基于图片裁剪组件cropper
 * *功能已被精简为仅处理cropper重构
 * author: colpu
 * change: zx
 * function: comicCropper
 */
function ComicCropper() {
  this.urlTool=null;//window.url
  this.cacheUrl=null;//url cache
  this.imgType = 'png' // image/png
  this.cropper = null; //缓存的cropper对象
  this.image = null; // 裁剪的图片
  this.options = {
      //存放cropper传入参数
  };
}
ComicCropper.prototype = {
    /*
    * 解析传入的图片并存入this
    * img [string/file/blob] 要重载的图片
    * */
    _parseImg:function(img){
        if(typeof img ==="string"){
            this.image.src = img;
            this.imgType=img.replace(/\..*?$/);
            if(this.imgType==="jpg"){
                this.imgType="jpeg";
            }
        }
        else {
            var URL = this.urlTool;
            if(URL){
                if (this.cacheUrl) {
                    URL.revokeObjectURL(this.cacheUrl);
                }
                this.image.src = this.cacheUrl = URL.createObjectURL(img);
                this.imgType=img.type|| "png";
            }
            else {
                console.log("浏览器不支持对应url对象！");
                return false;
            }
        }
        return true;
    },
  /**
   * 初始化方法
   * parmas [Object] opt为json对象
   */
  init: function(opt) {
    if (!opt && !opt.image) {
      throw ('必须设置图片');
    }
    //初始化URL工具
    this.urlTool = window.URL || window.webkitURL||null; // 获得原生的URL
    // 初始化option
    this.image = opt.image;//image必须为原生dom对象
    delete opt.image;
    // 创建实例
    this.cropper = new Cropper(this.image, Object.assign(this.options, opt));
  },
  /*
  * 销毁comicCropper
  * */
  destroy:function(){
      if(!this.cropper){
          console.log("cropper未初始化!");
      }
      else {
        this.cropper.destroy();
        this.options={};
        this.urlTool=this.cacheUrl=this.cropper=null;
        // this.image
      }
      return this;
  },
  /*
  * 调整cropper参数
  * method:要让cropper执行的方法
  * option:首要参数对象(可选)
  * secOption:次要参数对象(可选)
  * */
  change:function(method,option,secOption){
      if(!this.cropper){
          console.log("cropper未初始化!");
          return this;
      }
      if(typeof method!=="string"){
          console.log("change方法参数错误！");
      }
      var opt=option?option:{};
      var secOpt=secOption?secOption:{};

      var temp1,temp2,temp3,temp4;
      var self=this;
      //参数进一步处理
      switch (data.method) {
          case 'aspectRatio'://改变长宽比
              temp1 = this.cropper.getCropBoxData();
              temp2 = this.cropper.getCanvasData();
              this.options.aspectRatio=opt;
              var cacheFn=self.option.ready;
              this.opt.ready=function() {
                  self.cropper.setCropBoxData(cropBoxData).setCanvasData(canvasData);
                  self.option.ready = cacheFn;
              };
              self.reload();
              return this;
              break;
          case 'rotate':
              // this.cropper.clear();
              break;
      }
      //执行方法
      this.cropper[method](opt,secOpt);
      //善后处理
      switch (data.method) {
          case 'rotate':
              // this.cropper.crop();
              break;
          case 'scale':
          case 'scaleX':
          case 'scaleY':
              // target.setAttribute('data-option', -data.option);
              break;
      }
      return this;
  },
  /*
  * 获取当前裁剪区域内容
  * type: [string] 'blob/dataUrl' default:blob
  * callBack:回调
  * */
  getData:function(type,callBack){
      if(!this.cropper){
          console.log("cropper未初始化!");
          return this;
      }
      if(typeof callBack!=="function"){
          console.log("缺少回调!");
          return this;
      }
      var opt={};
      if(!opt.fillColor){//强制图片外的地方透明
          opt.fillColor="rgba(0,0,0,0)";
          //如果图片类型为jpg，背景为白色
          if (this.imgType === 'jpeg') {
              opt.fillColor='#fff';
          }
      }
      var res=this.cropper["getCroppedCanvas"](opt);
      if (res) {
          // 获得图片上传数据
          if (type==="dataUrl") {
              callBack(res.toDataURL('image/'+this.imgType));
          } else {
            // 修改获取图片类型，详见: toBlob, 第三个参数可设置质量0-1之间
            // https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLCanvasElement/toBlob
              res.toBlob(function (file) {
                  callBack(file)
              }, this.imgType);
          }
      }
      return this;
  },
  /*
  * 重载cropper（不销毁实例,且不改变配置）
  * */
  reset:function(img){
      if(!this.cropper){
          console.log("cropper未初始化!");
          return this;
      }
      this.cropper.replace(img);
  },
  /*
  * 重设cropper为新的file、(会销毁实例并应用新的option)
  * img [string/file/blob] 要重载的图片
  * opt 重设参数
  * callback 如果设置了这个 那么opt.ready将会失效！！
  * */
  reload:function(img,opt,callBack){
      if(!this.cropper){
        console.log("cropper未初始化!");
        return this;
      }
      // var uploadedImageURL = _this.uploadedImageURL;
      if(img){
        if(!this._parseImg(img)){
            return this;
        }
      }
      var opts=typeof opt==="object"?opt:{};
      if(typeof callBack==="function"){
          var tempCallBack=callBack;
          opts.ready=function(){//只执行一次然后销毁，避免在下次ready时再次触发了
              tempCallBack&&tempCallBack();
              tempCallBack=null;
          }
      }
      this.cropper.destroy();
      this.cropper = new Cropper(this.image, Object.assign(this.options,opts||{}));
      return this;
  },
  /*
  * 为某个file input绑定change事件，使其每次改变内容都会触发一次comicCropper的reload
  * fileDom：input原生对象 verify：验证函数，只有此函数返回false才会执行reload
  * */
  bindFileInput:function(obj,verify){
      if(!this.cropper){
          console.log("cropper未初始化!");
          return this;
      }
      var URL = this.urlTool,self=this;
      var verifyFn=typeof verify==="function"?verify:function(){};
      if (URL) {
          obj.onchange = function() {
              var files = this.files;
              var file;
              var _t=this;
              if (files && files.length) {
                  file = files[0];
                  if (/^image\/\w+/.test(file.type)) {
                      //抛出两个方法给verify函数用于确定验证成功或失败
                      verifyFn(file,function(){
                          self.reload(file);
                      },function(){
                          //暂无失败处理
                      });
                  }

                  this.value="";
              }
          };
      } else {
          obj.disabled = true;//禁止file input的点击
          // obj.parentNode.className += ' disabled';
          console.log("浏览器不支持对应url对象！");
          return this;
      }
  }
};